<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <!-- 
    ！注意写上题目题数
    例如 ：
    1、选择题
        (1) D
        (2) C
        (3) true false false
        (4) 
        (5) C
        
    2、填空题
        (1)、
          在dom操作中
          获取节点方法：
          (1)document.querySelector
          (2)document.querySelectorAll
          (3)document.getElementsByClassName
          (4)document.getElementsByName
          (5)document.getElementsByTagName

          创建节点方法
          (1)document.creatElement
          (2)document.createDocumentFragment

          添加节点方法
          (1)Node.innerHTML
          (2)Node.insertBefore
          (3)Node.appendChild

          dom的其他操作方法
          (1)Node.remove
          (2)Node.removeChild
          (3)Node.replaceChild
          (4)Node.children
          (5)Node.firstElementChild
          (6)Node.lastElementChild

      (2)、(1) Object.prototype
           (2) Function.prototype
           (3) Object.prototype
           (4) Array.prototype
           (5) Object.prototype
           (6) Function.prototype
           (7) Object.__proto__
           (8) Function.prototype
           (9) Boolean.prototype
           (10) Object.prototype

        3、描述题
           (1)答：ajax是一种在无需刷新加载整个网页的情况下，能够更新部分网页内容的技术

           (2)答：这个this是指构造函数Fn本身，它有prototype属性(原型对象)以及arguments等属性，它的原型有constructor(构造器)等属性

           (3)答：js调控同步和异步任务的机制称为event loop(事件循环),
           即是指主线程的同步任务全部执行完之后，任务队列中的异步任务会再次回到调用栈中执行

           (4)答：原型(prototype)是一个指针，指向的是一个对象，这个对象包含了通过构造函数所创建的实例对象共享的属性和方法,原型(prototype)就是能放公用方法、属性的地方

                  实例对象(__proto__)和原型(prototype)之间的连接，叫做原型链(隐式连接),
                  原型链方便代码自己去调用共享每种数据类型（就是对象）的方法、属性的链子

        4、逻辑题
          (1) Goodbye Jack
          (2) 10
          (3) 21
          (4) 667
          (5) Hy Jack 
          (6) 
          (7) 1 报错

        5、实操题
          (1)ES5函数模拟类、ES6创建类
            //ES5
            let Animal = function (type) {
              this.type = type;
            };
            Animal.prototype.eat = function () {
              console.log("like eat food");
            };
            let dog = new Animal("dog");
            let cat = new Animal("cat");
            console.log(dog);
            console.log(cat);

            cat.constructor.prototype.eat = function () {
              console.log("haihai1");
            };
            dog.eat();
            cat.eat();

            //ES6
            class Animal{
              constructor(type){
                  this.type = type
              }
              eat(){
                  console.log('eat')
              }
            }

              var dog = new Animal("dog");
              var cat = new Animal("cat");
              dog.eat()
              cat.eat()

          (2)Promise封装AJAX
              function ajax(_url, _data, _method) {
                //设置GET请求为默认请求
                let method = _method || "GET";
                //GET请求没有数据传入就直接是默认是null
                let data = _data || null;

                //返回Promise对象
                return new Promise((resolve, reject) => {
                  //实例化一个XMLHttpRequest对象
                  let xhr = new XMLHttpRequest();

                  if (method.toUpperCase() == "GET") {
                    let str = "?";
                    //处理get请求的参数
                    for (let k in data) {
                      str += `${k}=${data[k]}&`;
                    }
                    str = str.slice(0, -1);
                    xhr.open(method, _url + str);
                  } else {
                    xhr.open(method, _url);
                  }

                  //设置默认请求头
                  //设置请求头格式为json格式
                  xhr.setRequestHeader("Content-Type", "application/json");
                  xhr.send(JSON.stringify(data));

                  xhr.addEventListener("readystatechange", () => {
                    if (xhr.readyState == 4) {
                      if (xhr.status == 200) {
                        //返回解析成功结果
                        resolve(JSON.parse(xhr.responseText));
                      } else {
                        //拒绝
                        reject(JSON.parse(xhr.responseText));
                      }
                    }
                  });
                });
              }

          (3)数组去重
                let arr = [1, 2, 5, 2, 4, 5, 10, 2, 5, 1, 2, 4, 5, 8, 6, 4];
                let newArr = [];

                方法一
                arr.forEach(item => {
                  if(newArr.indexOf(item) == -1){
                    newArr.push(item);
                  }
                })
              
                方法二
                arr.forEach(item => {
                  if(!newArr.includes(item)){
                    newArr.push(item);
                  }
                })
              
                方法三
                newArr = arr.filter((item,index) => {
                  return arr.indexOf(item) == index;
                })
              
                方法四
                newArr = [...new Set(arr)];
              
                console.log(newArr);
    -->
  </body>
</html>
